﻿/*
@file: SLL-Base.h
@auther: ZZH
@info:单链表基本操作和数据结构，包括创建，遍历，插入，查找和删除
但并不是最终使用的接口，最终的接口请使用单链表实现文件内的
*/
#pragma once
#include "stdint.h"
#include "stdlib.h"

/*数据类型定义*/
typedef struct __SL_ListNode//单链表节点类型
{
    struct __SL_ListNode* next;
}SLListNode_t, * pSLListNode_t;

typedef enum
{
    SLL_Small,
    SLL_Big,
    SLL_Equal
}SLL_CompareResult_t;

typedef SLL_CompareResult_t(*__SLL_Compare) (pSLListNode_t node, void* value);
typedef void (*__SLL_Visit) (pSLListNode_t node, uint32_t level);
typedef void (*__SLL_Free) (pSLListNode_t node);

typedef struct//单链表类型
{
    pSLListNode_t head, tail;
    __SLL_Compare compare;
    __SLL_Visit visit;
    __SLL_Free free;
}SLList_t, * pSLList_t;
/*数据类型定义结束*/

/*********************************************************************************
对外开放的接口
*********************************************************************************/

/*基本操作*/
pSLListNode_t SLL_Head(pSLList_t list);
pSLListNode_t SLL_Tail(pSLList_t list);
void SLL_Delete(pSLList_t list);
pSLListNode_t SLL_Search(pSLList_t list, void* target);
uint32_t SLL_Length(pSLList_t list);
/*基本操作结束*/

/*遍历操作*/
/*遍历操作结束*/

/*********************************************************************************
不开放的接口
*********************************************************************************/

/*基本操作*/
pSLList_t __SLL_Create();
void __SLL_CreateStatic(pSLList_t list);
uint8_t __SLL_Insert(pSLList_t list, pSLListNode_t node);
uint8_t __SLL_DeleteNode(pSLList_t list, pSLListNode_t node);
pSLListNode_t __SLL_GetNode(pSLList_t list, uint32_t index);
/*基本操作结束*/

/*遍历操作*/
void __SLL_Traverse(pSLList_t list);
/*遍历操作结束*/